#include<iostream>
#include<string>
#include<vector>
#include<climits>
using namespace std;

int dx[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
int dy[8] = {0, 1, 1, 1, 0, -1, -1, -1};

int N, K;
string path;
string ret;
//创建一个数组用来标记已经走过的位置
bool vis[11][11];
int check[11][11];
int nums[11][11];

void dfs(int i,int j,int t){
    int target = (t == K - 1 ? 0 : t + 1);

    //如果找到第一个满足条件的路径一定是最小的，直接返回不用再找
    if(!ret.empty()){
        return;
    }

    //搜索出口
    if (i == N - 1 && j == N - 1 && (int)path.size() == (N * N - 1)){
        ret = path;
        return;
    } 

    for (int k = 0; k < 8; k++){
        //依次获取下一个移动的位置
        int x = i + dx[k];
        int y = j + dy[k];

        if (x >= 0 && x < N && y >= 0 && y < N && vis[x][y] == false && nums[x][y] == target){
            if(k==1&&(check[i-1][j]==3||check[i][j+1]==7)){
                continue;
            }
            else if(k==3&&(check[i][j+1]==5||check[i+1][j]==1)){
                continue;
            }
            else if(k==5&&(check[i][j-1]==3||check[i+1][j]==7)){
                continue;
            }
            else if(k==7&&(check[i][j-1]==1||check[i-1][j]==5)){
                continue;
            }
            else{
                vis[x][y] = true;
                check[i][j] = k;
                path += to_string(k);
                dfs(x, y, nums[x][y]);

                //回溯
                vis[x][y] = false;
                check[i][j] = -1;
                path.pop_back();
            }
        }
    }
}

int main(){
    //输入行数和列数N,输入k
    cin >> N >> K;
    
    //输入每行的数字
    for (int i = 0; i < N; i++){
        for (int j = 0; j < N; j++){
            cin >> nums[i][j];
            check[i][j] = -1;
        }
    }

    vis[0][0] = true;
    dfs(0, 0, nums[0][0]);

    //输出结果
    cout << (ret.empty() ? "-1" : ret);

    return 0;
}